/*
 * funcionesPPD.c
 *
 *  Created on: 25/09/2011
 *      Author: utn_so
 */

#include "libPPD.h"

int32_t calcularDireccion(int32_t unSector)
	{
	int32_t iDirARetornar;
	iDirARetornar = unSector * TAMSECTOR;


	return iDirARetornar;
	}

int32_t abrirMapearArchivoDisco (char* path, char** archivoMapeado)
{
    int32_t fileDescriptor;
    int32_t statusOk =0;
    struct stat stStatusArchivo;

	if((fileDescriptor = open (path,O_RDWR)) <= 0)
        {
        printf ("Error al abrir el archivo");
		return 0;
        }

	statusOk = fstat(fileDescriptor, &stStatusArchivo);
	*archivoMapeado = NULL;

    *archivoMapeado = mmap((caddr_t)0,stStatusArchivo.st_size,PROT_WRITE | PROT_EXEC, MAP_SHARED,fileDescriptor,(off_t)0);
    if (*archivoMapeado == (caddr_t)-1)
    {
    	perror("mmap() error");

    	return -1;
    }

    return fileDescriptor;
}


int32_t cerrarArchivoMapeado(char** archivoMapeado, int32_t fileDescriptor)
{
/* Si Hago primero el munmap estoy perdiendo el archivo, Revisar donde deberia ir */
	int32_t closeOk;
	struct stat stStatusArchivoCerrar;
	int32_t statusOk = 0;
	statusOk = fstat(fileDescriptor, &stStatusArchivoCerrar);

	if((closeOk = munmap(*archivoMapeado,stStatusArchivoCerrar.st_size)) != 0)
    	{
    		printf("Error Al Hacer unmap\n");
    		return Retorno_Error;
    	}

	 if ((closeOk = close(fileDescriptor))!=0)
	    {
	    	printf("Error En el Close\n");
	    	return Retorno_Error;
	    }

	 *archivoMapeado = NULL;
	 return Retorno_OK;
}

int32_t iniciarConsola ()
{
	pid_t pidConsola;
	char *rutaProceso[2];

	rutaProceso[0] = "/home/utn_so/Desarrollo/Workspace/Consola/Debug/Consola";
	rutaProceso [1] = NULL;

	pidConsola = fork();
	if (pidConsola == -1)
		printf("Error al crear el Proceso Consola\n");
	else if (pidConsola == 0)
		if (execv (rutaProceso[0], rutaProceso))
			printf ("Error al levantar el Proceso Consola\n");

	return Retorno_OK;
}

int32_t leerSector( int32_t iNumeroSector,void *vDatosAretornar)
{
      extern char *archivoMapeado;
      int32_t iDirALeer;
      iDirALeer = calcularDireccion(iNumeroSector);

      memcpy(vDatosAretornar,archivoMapeado + iDirALeer, TAMSECTOR);

      return Retorno_OK;

}

int32_t escribirSector( int32_t iNumeroSector,char *vDatosAEscribir)
{
    int32_t iDirAEscribir;
    extern char *archivoMapeado;

    iDirAEscribir = calcularDireccion(iNumeroSector);

    memcpy(archivoMapeado + iDirAEscribir, vDatosAEscribir, TAMSECTOR);

    msync(archivoMapeado + iDirAEscribir, TAMSECTOR, MS_SYNC);

    return Retorno_OK;

}
